From 02ae938c238c9d18448d17a8ec92c0edd8c17463 Mon Sep 17 00:00:00 2001
From: Bertrand Yuan <bert.yuan@outlook.com>
Date: Tue, 16 Dec 2025 00:12:49 +0800
Subject: feat(back-end): introduce payload

Payload is the next.js Headless CMS and App Framework,
I would like to pick it up and modify it as it is MIT licensed.

Many features in Payload is not applicable for our project.
So, I modify it so that it is light and clear.
---
 src/app/(main)/og/[...slug]/route.tsx | 58 +++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)
 create mode 100644 src/app/(main)/og/[...slug]/route.tsx

(limited to 'src/app/(main)/og/[...slug]/route.tsx')

diff --git a/src/app/(main)/og/[...slug]/route.tsx b/src/app/(main)/og/[...slug]/route.tsx
new file mode 100644
index 0000000..d713923
--- /dev/null
+++ b/src/app/(main)/og/[...slug]/route.tsx
@@ -0,0 +1,58 @@
+import { generateOGImage } from '@/app/(main)/og/[...slug]/og';
+import { metadataImage } from '@/lib/metadata-image';
+import type { ImageResponse } from 'next/og';
+
+async function loadAssets(): Promise<
+  { name: string; data: Buffer; weight: 400 | 600; style: 'normal' }[]
+> {
+  const [
+    { base64Font: normal },
+    { base64Font: mono },
+    { base64Font: semibold },
+  ] = await Promise.all([
+    import('./fonts/geist-regular-otf.json').then((mod) => mod.default || mod),
+    import('./fonts/geistmono-regular-otf.json').then(
+      (mod) => mod.default || mod,
+    ),
+    import('./fonts/geist-semibold-otf.json').then((mod) => mod.default || mod),
+  ]);
+
+  return [
+    {
+      name: 'Geist',
+      data: Buffer.from(normal, 'base64'),
+      weight: 400 as const,
+      style: 'normal' as const,
+    },
+    {
+      name: 'Geist Mono',
+      data: Buffer.from(mono, 'base64'),
+      weight: 400 as const,
+      style: 'normal' as const,
+    },
+    {
+      name: 'Geist',
+      data: Buffer.from(semibold, 'base64'),
+      weight: 600 as const,
+      style: 'normal' as const,
+    },
+  ];
+}
+
+export const GET = metadataImage.createAPI(
+  async (page): Promise<ImageResponse> => {
+    const [fonts] = await Promise.all([loadAssets()]);
+
+    return generateOGImage({
+      title: page.data.title,
+      description: page.data.description,
+      fonts,
+    });
+  },
+);
+
+export function generateStaticParams(): {
+  slug: string[];
+}[] {
+  return metadataImage.generateParams();
+}
-- 
cgit v1.2.3

